home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 6 / Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso / 009a / autofc20.zip / LEDIT.PAS < prev    next >
Pascal/Delphi Source File  |  1991-01-26  |  5KB  |  209 lines

  1.  
  2. UNIT ledit;
  3.  
  4. INTERFACE
  5.  
  6. uses dos,crt;
  7.  
  8.  
  9. procedure beep;
  10.  
  11.  
  12. function edit(f3:string;len:integer):string;
  13.  
  14. IMPLEMENTATION
  15.  
  16.  
  17.  
  18. procedure beep;
  19. begin
  20.     sound(440);
  21.     delay(100);
  22.     nosound;
  23. end;
  24.  
  25. function edit(f3:string;len:integer):string;
  26.  
  27. var
  28.      xpos,ypos,ch_int,ch1_int,
  29.      basex,basey,ins_flg,i           : integer;
  30.      ch,ch1                          : char;
  31.      blanks                          : string;
  32.      chx                             : string[1];
  33.      regs                            : registers;
  34.      top_scan, bot_scan,small_scan   : byte;
  35.  
  36. begin
  37.  if len = 0 then len := 255; {set to maximum}
  38.  {get the cursor configuration}
  39.  regs.ah := $0f; {get display columns(ah),mode(al), page(bh)}
  40.  intr($10,regs);
  41.  regs.ah := 3;   {get cursor configuration ch = start scan line, cl = end}
  42.  intr($10,regs); {dh = row, dl = column. Page is in bh from previous intr}
  43.  bot_scan := regs.cl;
  44.  top_scan := regs.ch;
  45.  small_scan := bot_scan - 1;
  46.  regs.ch := small_scan; {default to two scan line cursor}
  47.  regs.cl := bot_scan;
  48.  ins_flg := 0; {start in no insert mode}
  49.  
  50.  blanks := '';
  51.  for i := 1 to len do blanks := blanks + ' ';
  52.  if length(f3) > len then f3[0] := chr(len);
  53.  while length(f3) < len do
  54.  begin
  55.   f3 := f3+ ' ';
  56.  end;
  57.  ypos := wherey;
  58.  xpos := 1;
  59.  basey := ypos;
  60.  basex := wherex;
  61.  write(f3,'|');
  62.  gotoxy(basex + xpos - 1,ypos);
  63.  repeat
  64.   ch := readkey;
  65.   ch_int := ord(ch);
  66.   case ch_int of
  67.     0 :  {special charactre}
  68.     begin
  69.      ch1 := readkey;
  70.      ch1_int := ord(ch1);
  71.      case ch1_int of
  72.        71:
  73.         begin
  74.          xpos := 1;
  75.          gotoxy(basex + xpos -1,basey);
  76.         end;
  77.        79:
  78.         begin
  79.          xpos := len;
  80.          gotoxy(basex + xpos -1,basey);
  81.         end;
  82.        75:
  83.         begin
  84.          if basex + xpos - 1 > basex then
  85.           xpos := xpos-1
  86.          else
  87.           beep
  88.         end;
  89.        77:
  90.         begin
  91.          if basex + xpos + 1 <= basex+len then
  92.           xpos := xpos+1
  93.          else
  94.           beep
  95.         end;
  96.        82: {insert button - toggle insert mode}
  97.        begin
  98.         if ins_flg = 0 then
  99.         begin
  100.           ins_flg := 1;
  101.           regs.ch := $0;
  102.           regs.cl := bot_scan;
  103.         end
  104.         else
  105.         begin
  106.           ins_flg := 0;
  107.           regs.ch := small_scan;
  108.           regs.cl := bot_scan;
  109.         end;
  110.        regs.ah := $01; {cursor function}
  111.        intr($10,regs); {change the cursor}
  112.        end;
  113.        83: {delete character}
  114.         if f3 <> blanks then
  115.         begin
  116.          delete(f3,xpos,1);
  117.          f3 := f3 + ' ';    {keep len characters}
  118.          gotoxy(basex,basey);
  119.          write(f3);
  120.          gotoxy(basex + xpos -1,ypos);
  121.         end
  122.         else
  123.         begin
  124.          beep;
  125.         end;
  126.      end;
  127.      gotoxy(basex + xpos - 1,ypos)
  128.     end; {of special character}
  129.     else
  130.     begin
  131.  
  132.      case ch_int of
  133.      008: {backspace}
  134.      begin
  135.        if basex +xpos -1 > basex then
  136.        begin
  137.          f3[xpos-1] := ' ';
  138.          dec(xpos);
  139.          gotoxy(basex,basey);
  140.          write(f3);
  141.          gotoxy(basex + xpos -1,ypos);
  142.        end
  143.        else
  144.        begin
  145.          beep;
  146.        end;
  147.      end;
  148.      013: {return}
  149.      begin
  150.      {nothing}
  151.      end;
  152.      027: {escape}
  153.      begin
  154.       f3 := blanks; {set to blanks - will empty below}
  155.       gotoxy(basex,basey);
  156.       write(blanks);
  157.       gotoxy(basex,basey);
  158.       xpos := 1;
  159.      end;
  160.      else {not backspace, escape, or <cr>}
  161.       if ins_flg = 0 then {overwrite}
  162.       begin
  163.        write(ch);
  164.        f3[xpos] := ch;
  165.        if basex + xpos + 1 <= basex + len then
  166.        begin
  167.         inc(xpos);
  168.        end
  169.        else
  170.        begin
  171.         gotoxy(basex + xpos -1,ypos);
  172.         beep;
  173.        end;
  174.       end
  175.       else {insert}
  176.       begin
  177.        {if last char is blank and not end}
  178.        if (f3[len] = ' ') and (xpos < len) then 
  179.        begin
  180.         delete(f3,len,1);
  181.         insert(ch,f3,xpos);
  182.         gotoxy(basex,basey);
  183.         write(f3);
  184.         inc(xpos);
  185.         gotoxy(basex + xpos -1,ypos);
  186.        end
  187.        else
  188.        begin
  189.         beep;
  190.        end; {of last char blank test}
  191.       end; {of insert modes}
  192.      end; {case of not backspace or <cr>}
  193.     end; {case of regular characters}
  194.   end; {of cases of keyboard character}
  195.  until ch_int = 13;
  196. { gotoxy(1,22);
  197.  write('new description: ',f3);}
  198.  while f3[length(f3)] = ' ' do {strip trailing blanks}
  199.  begin
  200.   delete(f3,length(f3),1);
  201.  end;
  202.  edit := f3;
  203.  regs.ch := top_scan;  {Whatever cursor}
  204.  regs.cl := bot_scan;  {mode we started}
  205.  regs.ah := $1;        {in, put it back}
  206.  intr($10,regs);
  207. end; {function}
  208.  
  209. end. {unit}